﻿using System;
using System.Collections.Generic;
using TPDiseño.Clases_de_Entidad;
using DAO.DataSetConsultoraTableAdapters;

namespace DAO
{
    public class DAOOp_PreguntaTieneResp_Pregunta : DAO
    {
        //Atributos de manejo de instancia (singleton)
        static DAOOp_PreguntaTieneResp_Pregunta instance = null; 
         // Atributos para acceso a los DataSet Tipados
        private DataSetConsultora.Op_Respuesta_PreguntaDataTable PreguntaTieneRespTabla = new DataSetConsultora.Op_Respuesta_PreguntaDataTable();
        private Op_Respuesta_PreguntaTableAdapter PreguntaTieneRespTableAdapter= new Op_Respuesta_PreguntaTableAdapter();
        // Dependencias de otros DAOs
        //private DAOPregunta miDAOPregunta = DAOPregunta.Instance;
        //private DAOOp_Respuesta miDAOOp_Respuesta = DAOOp_Respuesta.Instance;


        public static DAOOp_PreguntaTieneResp_Pregunta Instance
        {
            get
            {
                if (instance == null)
                {
                    lock (padlock)
                    {
                        if (instance == null)
                        {
                            instance = new DAOOp_PreguntaTieneResp_Pregunta();
                        }
                    }
                }
                return instance;
            }
        }
        
        public PreguntaTieneResp guardar(PreguntaTieneResp unaPreguntaTieneRespuesta)
        {

            // Inserto en la db una PreguntaTieneRespuesta (ponderada) con su table adapter correspondiente en la tabla Op_Respuesta_Pregunta            
            PreguntaTieneRespTableAdapter.Insertar(unaPreguntaTieneRespuesta._ponderacion, unaPreguntaTieneRespuesta._pregunta._cod_pregunta, unaPreguntaTieneRespuesta._op_respuesta._cod_op_respuesta);
                        
            // Finalmente retorno lo que inserte
            return recolectarUno();

        }

        public void actualizar(PreguntaTieneResp unaPreguntaTieneRespuesta)
        {

            // Actualizo la Opcion de Respuesta en la db pro medio de su table adapter
            PreguntaTieneRespTableAdapter.actualizar(unaPreguntaTieneRespuesta._ponderacion, unaPreguntaTieneRespuesta._pregunta._cod_pregunta, unaPreguntaTieneRespuesta._op_respuesta._cod_op_respuesta);
        }

        /*
        public List<PreguntaTieneResp> cargarPorPregunta(int cod_pregunta){

            // Cargo los PreguntaTieneResp de la db
            PreguntaTieneRespTabla = PreguntaTieneRespTableAdapter.consultarPorPregunta(cod_pregunta);
            
            return recolectar();
        }
         */

        public List<PreguntaTieneResp> cargarPorOp_Respuesta(int cod_Op_Respuesta, Pregunta unaPregunta)
        {

            // Cargo los PreguntaTieneResp de la db
            PreguntaTieneRespTabla = PreguntaTieneRespTableAdapter.consultarPorOp_Respuesta(cod_Op_Respuesta);

            return recolectar(unaPregunta);
        }

        private List<PreguntaTieneResp> recolectar(Pregunta unaPregunta)
        {
            // Creo la lista para recolectar y devolver las PreguntaTieneResps cargados de la db
            List<PreguntaTieneResp> PreguntaTieneRespsCargados = new List<PreguntaTieneResp>();

            // Recorro las PreguntaTieneResps de la tabla
            foreach (DataSetConsultora.Op_Respuesta_PreguntaRow unaPreguntaTieneRespFila in PreguntaTieneRespTabla)
            {
                /*
                // Creo una PreguntaTieneResp y lo agrego a la lista de PreguntaTieneResps cargados
                PreguntaTieneRespsCargados.Add(new PreguntaTieneResp(miDAOPregunta.cargarUna(unaPreguntaTieneRespFila.Preguntacod_pregunta),
                                                                     miDAOOp_Respuesta.cargarUna(unaPreguntaTieneRespFila.Op_Respuestaid),
                                                                     unaPreguntaTieneRespFila.ponderacion
                                                                    )
                                              );
                 */
                
                // Creo una PreguntaTieneResp y lo agrego a la lista de PreguntaTieneResps cargados
                PreguntaTieneRespsCargados.Add(new PreguntaTieneResp(unaPregunta,      // Cerramos el grafo
                                                                     new Op_Respuesta(),
                                                                     unaPreguntaTieneRespFila.ponderacion
                                                                    )
                                              );
                
                

            }
            // Finalmente devuelvo la lista de PreguntaTieneRespsCargados            
            return PreguntaTieneRespsCargados;
        }



        private PreguntaTieneResp recolectarUno()
        {
            /*
            return new PreguntaTieneResp(miDAOPregunta.cargarUna(PreguntaTieneRespTabla[0].Preguntacod_pregunta),
                                         miDAOOp_Respuesta.cargarUna(PreguntaTieneRespTabla[0].Op_Respuestaid),
                                         PreguntaTieneRespTabla[0].ponderacion
                                        );
             */

            return new PreguntaTieneResp(new Pregunta(),
                                         new Op_Respuesta(),
                                         PreguntaTieneRespTabla[0].ponderacion
                                        );
        }
            
    }
}
